﻿using System;

namespace PhraseCorrector.SpellCore
{
        /// <summary>
        /// 第三方编辑距离算法的封装。
        /// </summary>
    public class EditDistance
    {

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 支持的编辑距离算法。
        /// </summary>
        public enum DistanceAlgorithm
        {
            /// <summary>
            /// Levenshtein 算法。
            /// </summary>
            Levenshtein,

            /// <summary>
            /// Damerau 最优字符串对齐算法。
            /// </summary>
            DamerauOSA
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 私有字段，用于存储距离计算算法的实例。
        /// 该算法用于计算两点之间的距离，是进行距离比较的基础。
        /// </summary>
        private DistanceAlgorithm algorithm;

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////      
        /// <summary>
        /// 私有字段，用于存储实现IDistance接口的实例。
        /// 该接口定义了距离比较的规则，是进行距离比较的具体实现。
        /// </summary>
        private IDistance distanceComparer;

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 创建一个新的 EditDistance 对象。
        /// </summary>
        /// <param name="algorithm">所需的编辑距离算法。</param>
        public EditDistance(DistanceAlgorithm algorithm)
        {
            this.algorithm= algorithm;
            distanceComparer= algorithm switch {
                DistanceAlgorithm.DamerauOSA=> new DamerauOSA(),
                DistanceAlgorithm.Levenshtein=> new Levenshtein(),
                _=> throw new ArgumentException("未知的编辑距离算法。")
            };
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 比较一个字符串与基准字符串之间的编辑距离，使用之前选择的算法。
        /// </summary>
        /// <param name="string1">基准字符串。</param>
        /// <param name="string2">要比较的字符串。</param>
        /// <param name="maxDistance">允许的最大距离。</param>
        /// <returns>编辑距离（如果超过最大距离则返回 -1）。</returns>
        public int Compare(string string1, string string2, int maxDistance)
        {
            return (int)this.distanceComparer.Distance(string1, string2, maxDistance);
        }
        public double Similarity(string string1, string string2) {
            return SpellCoefficient.Similarity(string1, string2);
        }
        public (int distance, double similay) Distance(string string1, string string2) {
            return SpellCoefficient.Distance(string1, string2);
        }
    }
}
